///*
// * frxs Inc.  湖南兴盛优选电子商务有限公司.
// * Copyright (c) 2018-2020. All Rights Reserved.
// */
//package util;
//
//import com.google.common.collect.Lists;
//import com.google.common.collect.Maps;
//import org.apache.commons.collections.CollectionUtils;
//import org.apache.commons.collections.MapUtils;
//
//import java.util.Collections;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//import java.util.function.Function;
//import java.util.stream.Collector;
//
///**
// * 分批工具
// * @author cmw
// * @version $Id: BatchUtils.java,v 0.1 2020年10月09日 10:04 上午 $Exp
// */
//public class BatchUtils {
//
//	private static final int DEFAULT_BATCH_SIZE = 100;
//
//	private BatchUtils() { }
//
//	/**
//	 * 分批查询数据
//	 * @param list 要拆分的数据
//	 * @param function 查询方法
//	 * @param <I> 参数类型
//	 * @param <R> 返回类型
//	 * @return 批量返回数据列表
//	 */
//	public static <I, R> List<R> doSelectPartList(List<I> list, Function<List<I>, List<R>> function) {
//		return doSelectPartList(list, DEFAULT_BATCH_SIZE, function);
//	}
//
//	/**
//	 * 分批查询数据
//	 * @param list 要拆分的数据
//	 * @param batchSize 拆分的大小
//	 * @param function 查询方法
//	 * @param <I> 参数类型
//	 * @param <R> 返回类型
//	 * @return 批量返回数据列表
//	 */
//	public static <I, R> List<R> doSelectPartList(List<I> list, int batchSize, Function<List<I>, List<R>> function) {
//		if (CollectionUtils.isEmpty(list) || batchSize <= 0) {
//			return Collections.emptyList();
//		}
//		List<List<I>> queryLists = Lists.partition(list, batchSize);
//		List<R> result = Lists.newArrayListWithCapacity(list.size());
//		for (List<I> queryList : queryLists) {
//			List<R> apply = function.apply(queryList);
//			if(CollectionUtils.isEmpty(apply)){
//				continue;
//			}
//			result.addAll(apply);
//		}
//		return result;
//	}
//
//
//	/**
//	 * 分批查询Map结构的数据, 内部不考虑key重复问题，请确保外层结果key重复情况下结果仍正确
//	 * @param list 要拆分查询的参数
//	 * @param batchSize 拆分的大小
//	 * @param function 查询方法
//	 * @param <K> Map中的Key
//	 * @param <V> Map中的Value
//	 * @param <I> list中的类型
//	 * @return
//	 */
//	public static <K,V,I> Map<K,V> doSelectPartSortedMap(List<I> list, int batchSize, Function<List<I>, Map<K,V>> function) {
//		if (CollectionUtils.isEmpty(list) || batchSize <= 0) {
//			return Collections.emptyMap();
//		}
//		List<List<I>> queryLists = Lists.partition(list, batchSize);
//		Map<K, V> resultMap = Maps.newLinkedHashMapWithExpectedSize(list.size());
//		for (List<I> queryList : queryLists) {
//			Map<K,V> apply = function.apply(queryList);
//			if(MapUtils.isEmpty(apply)){
//				continue;
//			}
//			resultMap.putAll(apply);
//		}
//		return resultMap;
//	}
//
//
//
//	/**
//	 * 分批查询结果集用Map返回
//	 * @param list 入参list
//	 * @param function 查询方法
//	 * @param collector collector
//	 * @param <I> 入参类型
//	 * @param <R> 查询方法返回值类型
//	 * @param <K> 返回Map的Key类型
//	 * @param <V> 返回Map的Value类型
//	 * @return Map<K, V>
//	 */
//	public static <I, R, K, V> Map<K, V> doSelectPartMap(List<I> list, Function<List<I>, List<R>> function, Collector<R, ?, Map<K, V>> collector) {
//		return doSelectPartMap(list, DEFAULT_BATCH_SIZE, function, collector);
//	}
//
//	/**
//	 * 分批查询结果集用Map返回
//	 * @param list 入参list
//	 * @param batchSize 拆分的大小
//	 * @param function 查询方法
//	 * @param collector collector
//	 * @param <I> 入参类型
//	 * @param <R> 查询方法返回值类型
//	 * @param <K> 返回Map的Key类型
//	 * @param <V> 返回Map的Value类型
//	 * @return Map<K, V>
//	 */
//	public static <I, R, K, V> Map<K, V> doSelectPartMap(List<I> list, int batchSize, Function<List<I>, List<R>> function, Collector<R, ?, Map<K, V>> collector) {
//		if (CollectionUtils.isEmpty(list) || batchSize <= 0) {
//			return Collections.emptyMap();
//		}
//		List<R> resultList = doSelectPartList(list, batchSize, function);
//		return resultList.stream().collect(collector);
//	}
//
//	/**
//	 * 分批查询结果集用Set返回
//	 * @param list 入参list
//	 * @param function 查询方法
//	 * @param collector collector
//	 * @param <I> 入参类型
//	 * @param <R> 查询方法返回值类型
//	 * @param <K> 返回Set的类型
//	 * @return Set<K>
//	 */
//	public static <I, R, K> Set<K> doSelectPartSet(List<I> list, Function<List<I>, List<R>> function, Collector<R, ?, Set<K>> collector) {
//		return doSelectPartSet(list, DEFAULT_BATCH_SIZE, function, collector);
//	}
//
//	/**
//	 * 分批查询结果集用Set返回
//	 * @param list 入参list
//	 * @param batchSize 拆分的大小
//	 * @param function 查询方法
//	 * @param collector collector
//	 * @param <I> 入参类型
//	 * @param <R> 查询方法返回值类型
//	 * @param <K> 返回Set的类型
//	 * @return Set<K>
//	 */
//	public static <I, R, K> Set<K> doSelectPartSet(List<I> list, int batchSize, Function<List<I>, List<R>> function, Collector<R, ?, Set<K>> collector) {
//		if (CollectionUtils.isEmpty(list) || batchSize <= 0) {
//			return Collections.emptySet();
//		}
//		List<R> resultList = doSelectPartList(list, batchSize, function);
//		return resultList.stream().collect(collector);
//	}
//}
